using System.ComponentModel.DataAnnotations;
using System.Reflection;

namespace System;

public static class EnumExtensions
{
    /// <summary>
    /// 使用提供的 <typeparamref name="T"/> <see cref="Enum"/> 抛出 <see cref="InvalidOperationException"/> 以指示它是未知的。可用于在 <see langword="switch"/> 的默认分支中引发标准化异常。
    /// </summary>
    public static InvalidOperationException UnknownEnumException<T>(this T other)
        where T : Enum =>
        new($"Unknown {other.GetType().Name}: '{other}'");

    /// <summary>
    /// 尝试检索 <see cref="Enum"/> 对象的 <see cref="DisplayAttribute.Name"/> 值。
    /// </summary>
    /// <returns>如果找到显示属性的名称，否则返回空字符串。</returns>
    public static string GetDisplayNameAttribute(this Enum enumValue) =>
        enumValue == null
            ? string.Empty
            : enumValue.GetType()
                .GetMember(enumValue.ToString())[0]
                .GetCustomAttribute<DisplayAttribute>()?
                .Name;
}
